﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using GestionEco;
using System.Drawing;
using System.IO;
using System.Threading;

namespace Ecosystème
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class GameEditeur : Microsoft.Xna.Framework.Game
    {
        private Plateau _plateau;
        public Plateau plateau
        {
            get { return _plateau; }
            set { _plateau = value; }
        }
        GraphicsDeviceManager graphics;

        SpriteBatch spriteBatch;
       
        Form f;

        List<TypeEspece> listType;
        //Liste d'etre vivant total contenu dans le plateau
        List<EtreVivant> NomDifferentVerif;
        Vector2[,] Positions;
        Texture2D[,] listText;
        List<List<Case>> tabCase;
        MouseState posSouris;
        KeyboardState curState;
        static float _translationX = 0.0f;
        static float _translationY = 0.0f;
        float Tx = 0;
        List<Plateau> listPlateau;
        int[,] opacite;
        frmGestionEditeur fp;
        float Ty = 0;
        Vector2 vect;
        RenderTarget2D _2Dmap;
        float _zoom2 = 0.9F;
        RenderTarget2D _mapTransformation;
        float _zoom = 1;
        readonly Vector2 _scale = new Vector2(1.0f, 0.5f);
        // centre de ma map (ma rotation se fera en fonction de ce point).
        readonly Vector2 _mapOrigin = new Vector2(-(TileCount * TileSize) / 2.0f, (TileCount * TileSize) / 2.0f);
        const int TileCount = 5;
        const int TileSize = 200;
        readonly float _rotationAngle = 0.7854f; // = 45°.
        public GameEditeur()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
            graphics.IsFullScreen = false;
            graphics.SynchronizeWithVerticalRetrace = false;
            //graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft;
            graphics.ApplyChanges();
            this.IsMouseVisible = true;

            IntPtr ptr = this.Window.Handle;
            // liste par défaut des types d'être vivant disponible à insérer
            
            // On transforme la page xna en windowsform
            f = (System.Windows.Forms.Form)System.Windows.Forms.Control.FromHandle(ptr);
            f.FormBorderStyle = FormBorderStyle.None;
            fp = new frmGestionEditeur();
            fp.StartPosition = FormStartPosition.Manual;
            fp.Location = new System.Drawing.Point(5, 84);
            fp.FormBorderStyle = FormBorderStyle.None;
            listType = new List<TypeEspece>();
            System.Drawing.Image img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/Chevre.png");
            TypeEspece te = new TypeEspece("Chèvre", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/Loup.png");
            te = new TypeEspece("Loup", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/pigeon.png");
            te = new TypeEspece("Pigeon", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/requin.png");
            te = new TypeEspece("Requin", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/tulipe.png");
            te = new TypeEspece("Tulipe", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/cactus.png");
            te = new TypeEspece("Cactus", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/chat.png");
            te = new TypeEspece("Chat de gouttière", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/chien.png");
            te = new TypeEspece("Chien sauvage", img);
            listType.Add(te);
            img = System.Drawing.Image.FromFile(Content.RootDirectory + "/EtreVivants/chameau.png");
            te = new TypeEspece("Chameau", img);
            listType.Add(te);
            fp.listtype = listType;
            fp.Show();
            //f.Visible = true;
            //this.graphics.PreferredBackBufferFormat = SurfaceFormat.Vector2;
            //this.graphics.ToggleFullScreen();
           
            

        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here

            //Jeu.largeurEcran = Window.ClientBounds.Width;
            //Jeu.hauteurEcran = Window.ClientBounds.Height;
            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            NomDifferentVerif = new List<EtreVivant>();
            //this.uneTileMap=new tileMap(Content.Load<Texture2D>("textures"),Content.RootDirectory);
            //this.uneTileMap.chargerMap("laMap");
            // On créer le tableau des 144 cases (texture qui permette de mettre des image)
            //listPlateau = new List<Plateau>()
            tabCase = new List<List<Case>>();
            // On créer les 144 positions de chaque texture (coordonnées)
            
            //List<Case> lc;
            //    for (int i = 0; i < 12; i++)
            //    {
            //        lc = new List<Case>();
            //        for (int j = 0; j < 12; j++)
            //        {

            //            Case c = new Case(Content.Load<Texture2D>("CaseVide"), "");
            //            lc.Add(c);
                        
                        
            //            // On créé la liste des êtres vivants qui sont dans une case
            //            //opacite[i, j] = 255;
            //        }
            //        tabCase.Add(lc);
            //    }
            GenerationCarteAutomatique();
               
            //Jeu.simulation();
            // On crée la map 2D
            _2Dmap = new RenderTarget2D(GraphicsDevice, TileCount * TileSize, TileCount * TileSize);
            // On crée la map qui va permettre de transformer la map 2d en 3d iso
            _mapTransformation = new RenderTarget2D(GraphicsDevice, 2 * (TileCount * TileSize), 2 * (TileCount * TileSize));

            plateau = new Plateau();
            //plateau.LesCases = tabCase;
            // TODO: use this.Content to load your game content here
        }

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here

            //Jeu.deplacementDesIndividus();
            // Initialisation des actions avec la souries
            posSouris = Mouse.GetState();

            // Initialisation des actions avec le clavier
            curState = Keyboard.GetState();
            if (fp.Full3DIso)
            {
                f.Width = 1200;
            }
            else
            {
                f.Width = 800;
            }

            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Z))
            {
                //On zoome
                _zoom += 0.02F;

            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.X))
            {
                // on dézoome
                if (_zoom > 0.4f)
                    _zoom -= 0.02F;

            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Escape))
            {
                //Mettre la carte en pleine écran pour voir mieux l'écosysteme et le déroulement aucune modif possible en pleine écran
                //this.graphics.IsFullScreen = true;
                _zoom2 = 1;
                this.graphics.ToggleFullScreen();
                if (!this.graphics.IsFullScreen)
                    _zoom2 = 0.9F;
            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Right))
            {
                _translationX -= 10.0f * _zoom;
            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Left))
            {
                // On se déplace vers la gauche
                if (_translationX < 0)
                    _translationX += 10.0f * _zoom;
            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Down))
            {
                _translationY -= 10.0f * _zoom;
            }
            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Up))
            {
                // On se déplace vers le haut
                if (_translationY < 0)
                    _translationY += 10.0f * _zoom;
            }

            if (curState.IsKeyDown(Microsoft.Xna.Framework.Input.Keys.Enter))
            {
                bool TerrainCase = true;
                for (int i = 0; i < 12; i++)
                {
                    for (int j = 0; j < 12; j++)
                    {
                        if (tabCase[i][j].Terrain == null)
                            TerrainCase = false;
                    }
                }
                if (TerrainCase)
                {
                    plateau.LesCases = tabCase;
                    fp.Close();
                    //this.Hide();
                    
                    this.Exit();

                }
                else
                {
                    MessageBox.Show("Toutes les cases ne comportent pas un terrain !");
                }
            }

            if (posSouris.LeftButton == Microsoft.Xna.Framework.Input.ButtonState.Pressed)
            {
                if (posSouris.X <= 800 && posSouris.Y <= 600)
                {
                    // Microsoft.Xna.Framework.Point p = new Microsoft.Xna.Framework.Point(_mapTransformation.Bounds.Width,_mapTransformation.Bounds.Height);
                    if (fp.terrain != null)
                    {
                        for (int i = 0; i < 12; i++)
                        {
                            for (int j = 0; j < 12; j++)
                            {

                                //Vector2 vector = convertScreenCoordInTileCoord(posSouris.X, posSouris.Y);
                                //opacite[i, j] = 255;
                                //if (fdc != null)
                                //{
                                //    fdc.Close();
                                //    fdc = null;
                                //}
                                Vector2 pos = new Vector2(posSouris.X - _translationX, posSouris.Y - _translationY);
                                //listText[i, j].GraphicsDevice.SetRenderTarget(null);
                                // On cherche la position de la case à sélectionner (peut se faire qu'en 2D)
                                if (pos.X >= tabCase[i][j].Position.X && pos.X <= (tabCase[i][j].Position.X + tabCase[i][j].TextureCase.Width * _zoom) && pos.Y >= tabCase[i][j].Position.Y && pos.Y <= (tabCase[i][j].Position.Y + tabCase[i][j].TextureCase.Height * _zoom))
                                {
                                    if (tabCase[i][j].ListEVCase.Count == 0)
                                    {
                                        //On sélectionne le terrain a ajouter pour cette case
                                        if (fp.terrain.TypeTerrain == "Mer")
                                        {
                                            tabCase[i][j].TextureCase = Content.Load<Texture2D>("mer");
                                            tabCase[i][j].Terrain = fp.terrain;
                                        }
                                        if (fp.terrain.TypeTerrain == "Plaine")
                                        {
                                            tabCase[i][j].TextureCase = Content.Load<Texture2D>("Plaine");
                                            tabCase[i][j].Terrain = fp.terrain;
                                        }
                                        if (fp.terrain.TypeTerrain == "Forêt")
                                        {
                                            tabCase[i][j].TextureCase = Content.Load<Texture2D>("Foret");
                                            tabCase[i][j].Terrain = fp.terrain;
                                        }
                                        if (fp.terrain.TypeTerrain == "Montagne")
                                        {
                                            tabCase[i][j].TextureCase = Content.Load<Texture2D>("Montagne");
                                            tabCase[i][j].Terrain = fp.terrain;
                                        }
                                        if (fp.terrain.TypeTerrain == "Désert")
                                        {
                                            tabCase[i][j].TextureCase = Content.Load<Texture2D>("Desert");
                                            tabCase[i][j].Terrain = fp.terrain;
                                        }
                                    }
                                    else
                                    {
                                        MessageBox.Show("Cette case contient des êtres vivants le type de terrain ne peut pas etre changé.");
                                    }
                                }
                            }
                        }
                    }
                    if (fp.ImageEtre != null)
                    {
                        for (int i = 0; i < 12; i++)
                        {
                            for (int j = 0; j < 12; j++)
                            {
                                //opacite[i, j] = 255;
                                //if (fdc != null)
                                //{
                                //    fdc.Close();
                                //    fdc = null;
                                //}
                                //Vector2 vector = convertScreenCoordInTileCoord(posSouris.X, posSouris.Y);
                                Vector2 pos = new Vector2(posSouris.X - _translationX, posSouris.Y - _translationY);
                                //listText[i, j].GraphicsDevice.SetRenderTarget(null);
                                if (pos.X >= tabCase[i][j].Position.X && pos.X <= (tabCase[i][j].Position.X + tabCase[i][j].TextureCase.Width * _zoom) && pos.Y >= tabCase[i][j].Position.Y && pos.Y <= (tabCase[i][j].Position.Y + tabCase[i][j].TextureCase.Height * _zoom))
                                {
                                    int numnom = 0;
                                    // On vérifie que le nom n'existe pas déjà sinon on ajoute +1 au compteur loup0 existe du coup on crée loup1
                                    foreach (EtreVivant ev in NomDifferentVerif)
                                    {
                                        if (ev.NomEtre == fp.nomEtre + "-" + numnom.ToString())
                                            numnom++;
                                    }
                                    Random rnd = new Random();
                                    //int randomNumber = rnd.Next(1, 7);
                                    Random rnd2 = new Random();
                                    int randomNumber2 = rnd.Next(1, 3);
                                    bool sexeAnimal = true;
                                    EtreVivant e = null;
                                    //On crée l'être vivant a insérer
                                    if (fp.nomEtre == "Tulipe")
                                    {
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        // Ici il faut définir les caractéristique de la tullipe niveau soif
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        e = new Tulipe(sexeAnimal, VieMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Cactus")
                                    {
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        e = new Cactus(sexeAnimal, VieMax,soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Chameau")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;

                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Chameau(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Chat de gouttière")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Chat(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Chien sauvage")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Chien(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Loup")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Loup(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6,fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Pigeon")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Pigeon(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Chèvre")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Chevre(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    if (fp.nomEtre == "Requin")
                                    {
                                        // Paramètre à régler je vous laisse faire j'ai mis des paramètre par défaut pour le moment
                                        if (randomNumber2 == 1)
                                            sexeAnimal = true;
                                        else
                                            if (randomNumber2 == 2)
                                                sexeAnimal = false;
                                        int VieMax = 100 * rnd.Next(1, 7) * 10;
                                        int attaque = 2 * (rnd.Next(1, 7));
                                        int esquive = 2 * (rnd.Next(1, 7));
                                        int degats = 1 * (rnd.Next(1, 7));
                                        int vue = 5 * rnd.Next(1, 7);
                                        int regen = 15 * rnd.Next(1, 7);
                                        int faimMax = 10 * rnd.Next(1, 7);
                                        int soifMax = 10 * rnd.Next(1, 7);
                                        //int faimActuelle = this.faimMax;
                                        //int coeffFaim = unCoeffFaim;

                                        e = new Requin(sexeAnimal, VieMax, attaque, esquive, degats, vue, regen, faimMax, soifMax, 6, fp.ImageEtre);
                                    }
                                    bool insertpossible = false;
                                    // On vérifie si la case contient un terrain et que cet être peut bien être mis dans ce terrain (On met pas un loup sur une mer !)
                                    if (e != null && tabCase[i][j].Terrain != null)
                                    {
                                        for (int k = 0; k < e.TypeTerrain.Count; k++)
                                        {
                                            if (e.TypeTerrain[k] == tabCase[i][j].Terrain.TypeTerrain)
                                                insertpossible = true;
                                        }
                                        if (!insertpossible)
                                            MessageBox.Show("Le type de terrain n'est pas adapté pour cet être vivant, vous devez insérer cet être sur un autre terrain.");
                                    }
                                    //On limite 9 êtres vivants au maximum par case car ya pas besoin d'avoir 50 loups sur une case 9 suffise
                                    //if (tabCase[i][j].ListEVCase.Count > 8)
                                    //{
                                    //    insertpossible = false;
                                    //    MessageBox.Show("La case est pleine");
                                    //}
                                    // Ajout a la liste de l'être vivant
                                    if (insertpossible)
                                    {
                                            System.Drawing.Image im = e.ImageEtre;
                                            //On resize l'image
                                            Bitmap img = new Bitmap(im, new Size(200, 200));
                                            using (MemoryStream s = new MemoryStream())
                                            {

                                                img.Save(s, System.Drawing.Imaging.ImageFormat.Png);
                                                s.Seek(0, SeekOrigin.Begin);
                                                // Ajout de l'image sur la texture de l'être vivant
                                                e.Texture = Texture2D.FromStream(this.spriteBatch.GraphicsDevice, s);
                                            }
                                        tabCase[i][j].ListEVCase.Add(e);
                                        NomDifferentVerif.Add(e);
                                    }
                                }
                            }
                        }
                    }
                    //if (fp.ImageEtre == null && fp.terrain == null && !fp.Full3DIso && !this.graphics.IsFullScreen)
                    //{
                    //    for (int i = 0; i < 12; i++)
                    //    {
                    //        for (int j = 0; j < 12; j++)
                    //        {

                    //            //Vector2 vector = convertScreenCoordInTileCoord(posSouris.X, posSouris.Y);
                    //            Vector2 pos = new Vector2(posSouris.X - _translationX, posSouris.Y - _translationY);
                    //            //opacite[i, j] = 255;
                    //            //listText[i, j].GraphicsDevice.SetRenderTarget(null);
                    //            if (pos.X >= Positions[i, j].X && pos.X <= (Positions[i, j].X + listText[i, j].Width * _zoom) && pos.Y >= Positions[i, j].Y && pos.Y <= (Positions[i, j].Y + listText[i, j].Height * _zoom))
                    //            {
                    //                //On vérifie que le terrain de la case n'est pas null
                    //                if (tabCase[i, j].getTerrain() != null)
                    //                {
                    //                    if (opacite[i, j] == 255)
                    //                    {
                    //                        if (fdc != null)
                    //                            fdc.Close();
                    //                        //On diminue l'opacité pour sélectionner la case
                    //                        opacite[i, j] = 200;
                    //                        fdc = new frmDetailCase();
                    //                        fdc.FormBorderStyle = FormBorderStyle.None;
                    //                        fdc.Location = new System.Drawing.Point(1083, 84);
                    //                        fdc.terrain = tabCase[i, j].getTerrain();
                    //                        fdc.evCourant = lev[i, j];
                    //                        fdc.Show();
                    //                    }
                    //                    else
                    //                    {
                    //                        //On remet l'opacité a 255 en rappuyant sur la case si elle était sélectionner pour la désélectionner
                    //                        opacite[i, j] = 255;
                    //                        fdc.Close();
                    //                        fdc = null;
                    //                    }
                    //                }
                    //            }
                    //            else
                    //            {
                    //                //Si on sélectionne une autre case on désélectionne celle sélectionner avant
                    //                opacite[i, j] = 255;
                    //            }
                    //        }
                    //    }
                    //}
                    Thread.Sleep(300);
                }
            }
            //if (fgp.Reduire)
            //{
            //    fgp.WindowState = FormWindowState.Minimized;
            //    fp.WindowState = FormWindowState.Minimized;
            //    f.WindowState = FormWindowState.Minimized;
            //    if (fdc != null)
            //        fdc.WindowState = FormWindowState.Minimized;
            //    fgp.Reduire = false;
            //}
            //if (f.WindowState == FormWindowState.Normal)
            //{
            //    fgp.WindowState = FormWindowState.Normal;
            //    fp.WindowState = FormWindowState.Normal;
            //    if (fdc != null)
            //        fdc.WindowState = FormWindowState.Normal;
            //}
            //if (fgp.Quitter)
            //{
            //    fgp.Close();
            //    fp.Close();
            //    if (fdc != null)
            //        fdc.Close();
            //    this.Exit();
            //}

            if (!fp.Full3DIso)
            {
                // redimentionnement pour ne pas dépassé en fonction de la taille total du plateau en 2D
                if (_translationX < -(tabCase[0][0].TextureCase.Width * (12 - (2 / _zoom))) * _zoom)
                    _translationX = -(tabCase[0][0].TextureCase.Width * (12 - (2 / _zoom))) * _zoom;
                if (_translationY < -(tabCase[0][0].TextureCase.Height * (12 - (1.5F / _zoom))) * _zoom)
                    _translationY = -(tabCase[0][0].TextureCase.Height * (12 - (1.5F / _zoom))) * _zoom;
            }
            else
            {
                // redimentionnement pour ne pas dépassé en fonction de la taille total du plateau en 3D iso
                if (_translationX < -(tabCase[0][0].TextureCase.Width * (12 - (2.5F / _zoom))) * _zoom)
                    _translationX = -(tabCase[0][0].TextureCase.Width * (12 - (2.5F / _zoom))) * _zoom;
                if (_translationY < -(tabCase[0][0].TextureCase.Height * (12 - (2.5F / _zoom))) * _zoom)
                    _translationY = -(tabCase[0][0].TextureCase.Height * (12 - (2.5F / _zoom))) * _zoom;

                //if (fdc != null)
                //{
                //    fdc.Close();
                //    fdc = null;
                //}
            }

            //if (fgp.Play)
            //{
            //    //Gestion du temps et des actions des être vivants seront faite ici
            //    for (int i = 0; i < 12; i++)
            //    {

            //        for (int j = 0; j < 12; j++)
            //        {
            //            for (int k = 0; k < lev[i, j].getListEtre().Count; k++)
            //            {
            //                for (int l = k; l >= 0; l--)
            //                {
            //                    if (l != k)
            //                    {
            //                        if (lev[i, j].getListEtre()[k].getFaimMax() != 0)
            //                        {
            //                            int numnom = 0;
            //                            EtreVivant ev1 = lev[i, j].getListEtre()[k].seReproduire(lev[i, j].getListEtre()[l]);
            //                            foreach (EtreVivant ev in NomDifferentVerif)
            //                            {
            //                                if (ev.getNomEtre() == fp.nomEtre + "-" + numnom.ToString())
            //                                    numnom++;
            //                            }
            //                            if (ev1 != null)
            //                                lev[i, j].getListEtre().Add(ev1);
            //                        }
            //                    }
            //                }
            //            }
            //        }
            //    }
            //}

            //plateau.setPositions(Positions);
            //plateau.setOpacite(this.opacite);
            //plateau.setTabText(this.listText);
            //plateau.setTabCase(this.tabCase);
            //plateau.setTabListeEtre(this.lev);

            base.Update(gameTime);

        }

       
        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.DarkOliveGreen);
            if (fp.Full3DIso)
                GraphicsDevice.SetRenderTarget(_2Dmap);
            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullNone, null, GetMatrix(GraphicsDevice));
            // On pivote les images des êtres vivant sur 45° poour donner l'impression qu'ils sont debout sur la case en 3D iso
            float rad = -0.424999744F;
            //float rad = -0.8F;
            //float rad = -(float)Math.PI / 2.0f;
            int largeur2 = 0;
            int longueur = 0;
            for (int i = 0; i < 12; i++)
            {
                largeur2 = 0;
                for (int j = 0; j < 12; j++)
                {
                    // On crée les coordonnées par case (positions)
                    tabCase[i][j].Position = new Vector2(largeur2, longueur);

                    // On dessine les cases du plateau
                    spriteBatch.Draw(tabCase[i][j].TextureCase, tabCase[i][j].Position, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, tabCase[i][j].Opacite));
                    largeur2 += tabCase[0][0].TextureCase.Width;
                    //Positions[i, j].X = Positions[i, j].X * _zoom;
                    //Positions[i, j].Y = Positions[i, j].Y * _zoom;
                }
                longueur += tabCase[0][0].TextureCase.Height;
            }
            spriteBatch.End();
            spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.None, RasterizerState.CullNone, null, GetMatrix(GraphicsDevice));
            bool ajoutImage = true;
            for (int i = 0; i < 12; i++)
            {
                //largeur2 = 0;
                for (int j = 0; j < 12; j++)
                {
                    int t = -1;
                    // On parcours la liste des êtres vivants contenu dans une case
                    for (int k = 0; k < tabCase[i][j].ListEVCase.Count; k++)
                    {

                        for (int l = k; l >= 0; l--)
                        {
                            if (k > 0)
                            {
                                if (k != l)
                                {
                                    if (tabCase[i][j].ListEVCase[l].ImageEtre == tabCase[i][j].ListEVCase[k].ImageEtre)
                                    {
                                        ajoutImage = false;
                                        break;
                                    }
                                }
                            }

                        }
                        if (ajoutImage)
                            t++;
                        // On dessine les êtres sur la case 9 images au maximum
                        if (t == 0 && ajoutImage)
                            spriteBatch.Draw(tabCase[i][j].ListEVCase[k].Texture, new Vector2(tabCase[i][j].Position.X + 0, tabCase[i][j].Position.Y + 0), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -60), 0.8F, SpriteEffects.None, 0);
                        if (t == 1 && ajoutImage)
                        {
                            spriteBatch.Draw(tabCase[i][j].ListEVCase[k].Texture, new Vector2(tabCase[i][j].Position.X + 0, tabCase[i][j].Position.Y + 200), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -60), 0.8F, SpriteEffects.None, 0);
                        }
                        if (t == 2 && ajoutImage)
                            spriteBatch.Draw(tabCase[i][j].ListEVCase[k].Texture, new Vector2(tabCase[i][j].Position.X + 200, tabCase[i][j].Position.Y + 0), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -60), 0.8F, SpriteEffects.None, 0);
                        if (t == 3 && ajoutImage)
                            spriteBatch.Draw(tabCase[i][j].ListEVCase[k].Texture, new Vector2(tabCase[i][j].Position.X + 200, tabCase[i][j].Position.Y + 200), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -60), 0.8F, SpriteEffects.None, 0);
                        //if (t == 4 && ajoutImage)
                        //    spriteBatch.Draw(lev[i, j].getListEtre()[k].getTexture(), new Vector2(Positions[i, j].X + 200, Positions[i, j].Y + 0), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -110), 0.8F, SpriteEffects.None, 0);
                        //if (t == 5 && ajoutImage)
                        //    spriteBatch.Draw(lev[i, j].getListEtre()[k].getTexture(), new Vector2(Positions[i, j].X + 200, Positions[i, j].Y + 100), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -110), 0.8F, SpriteEffects.None, 0);
                        //if (t == 6 && ajoutImage)
                        //    spriteBatch.Draw(lev[i, j].getListEtre()[k].getTexture(), new Vector2(Positions[i, j].X + 0, Positions[i, j].Y + 200), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -110), 0.8F, SpriteEffects.None, 0);
                        //if (t == 7 && ajoutImage)
                        //    spriteBatch.Draw(lev[i, j].getListEtre()[k].getTexture(), new Vector2(Positions[i, j].X + 100, Positions[i, j].Y + 200), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -110), 0.8F, SpriteEffects.None, 0);
                        //if (t == 8 && ajoutImage)
                        //    spriteBatch.Draw(lev[i, j].getListEtre()[k].getTexture(), new Vector2(Positions[i, j].X + 200, Positions[i, j].Y + 200), null, Microsoft.Xna.Framework.Color.FromNonPremultiplied(255, 255, 255, 255), rad, new Vector2(-0, -110), 0.8F, SpriteEffects.None, 0);
                        ajoutImage = true;
                    }
                    tabCase[i][j].Position = tabCase[i][j].Position * _zoom;
                    //tabCase[i][j].Position.Y = tabCase[i][j].Position.Y * _zoom;
                }
            }

            spriteBatch.End();
            if (fp.Full3DIso)
            {
                //On transforme le plan 2D en 3D iso
                GraphicsDevice.SetRenderTarget(_mapTransformation);
                GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.DarkOliveGreen);
                spriteBatch.Begin();
                // On dessine notre map en 2D en lui faisant faire une rotation de 45°.
                spriteBatch.Draw(_2Dmap, new Vector2(0, 400), null, Microsoft.Xna.Framework.Color.White, _rotationAngle, _mapOrigin, _zoom2, SpriteEffects.None, 0);
                spriteBatch.End();

                // On revient sur notre plan de départ
                GraphicsDevice.SetRenderTarget(null);
                GraphicsDevice.Clear(Microsoft.Xna.Framework.Color.DarkOliveGreen);

                spriteBatch.Begin();

                // On dessine notre map transformée en appliquant un vecteur
                // de redimentionnement (0.286 sur l'axe des abscisse et 0.16 sur l'axe des ordonnées).
                vect = new Vector2(0.57F, 0.3F);
                spriteBatch.Draw(_mapTransformation, Vector2.Zero, null, Microsoft.Xna.Framework.Color.White, 0, Vector2.Zero, vect, SpriteEffects.None, 0);
                spriteBatch.End();
            }

            base.Draw(gameTime);
        }

        void graphics_PreparingDeviceSettings(object sender, PreparingDeviceSettingsEventArgs e)
        {
            //e.GraphicsDeviceInformation.PresentationParameters.DeviceWindowHandle = drawSurface;
        }

        private void Game1_VisibleChanged(object sender, EventArgs e)
        {
            //if (System.Windows.Forms.Control.FromHandle((this.Window.Handle)).Visible == true)
            //    System.Windows.Forms.Control.FromHandle((this.Window.Handle)).Visible = false;
        }

        public Matrix GetMatrix(GraphicsDevice graphicsDevice)
        {
            Tx = _translationX;
            Ty = _translationY;
            //Matrix translateToOrigin = Matrix.CreateTranslation(-Tx, -Ty, 0);
            Matrix translateToOrigin = Matrix.CreateTranslation(0, 0, 0);
            //Microsoft.Xna.Framework.Matrix rotationMatrix = Microsoft.Xna.Framework.Matrix.CreateRotationZ(MathHelper.ToRadians(MathHelper.ToRadians(MathHelper.ToRadians(_rotationInDegrees))));
            //Matrix myMatrix = Matrix.CreateRotationX(RotateZ);
            // On crée le zoom 
            Matrix zoomMatrix = Matrix.CreateScale(_zoom, _zoom, 0);
            // On crée la translation
            Microsoft.Xna.Framework.Matrix translateBackToPosition = Microsoft.Xna.Framework.Matrix.CreateTranslation(Tx, Ty, 0);
            //Matrix compositeMatrix = translateToOrigin * rotationMatrix * zoomMatrix * translateBackToPosition;
            //On redimentionne en fonction des valeur
            Microsoft.Xna.Framework.Matrix compositeMatrix = zoomMatrix * translateBackToPosition * translateToOrigin;
            //Microsoft.Xna.Framework.Matrix compositeMatrix = zoomMatrix * translateToOrigin * rotationMatrix;
            // On renvoie la transformation
            return compositeMatrix;
        }

        private void GenerationCarteAutomatique()
        {
            List<Case> lc;
            for (int i = 0; i < 12; i++)
            {
                lc = new List<Case>();
                for (int j = 0; j < 12; j++)
                {
                    int numtypeterrain = 0;
                    Random rdm = new Random();
                    numtypeterrain = rdm.Next(1, 6);
                    Terrain terrain;
                    if (numtypeterrain == 1)
                    {
                        Case c = new Case(Content.Load<Texture2D>("mer"), "Mer");
                        terrain = new Terrain(10, 10, "Mer");
                        c.Terrain = terrain;
                        lc.Add(c);
                    }
                    if (numtypeterrain == 2)
                    {
                        Case c = new Case(Content.Load<Texture2D>("Foret"), "Forêt");                       
                        Random rdm2 = new Random();
                        int quantiteEau = rdm2.Next(7, 10);
                        terrain = new Terrain(quantiteEau, quantiteEau, "Forêt");
                        c.Terrain = terrain;
                        lc.Add(c);
                    }
                    if (numtypeterrain == 3)
                    {
                        Case c = new Case(Content.Load<Texture2D>("Plaine"), "Plaine");
                        Random rdm2 = new Random();
                        int quantiteEau = rdm2.Next(4, 7);
                        terrain = new Terrain(quantiteEau, quantiteEau, "Plaine");
                        c.Terrain = terrain;
                        lc.Add(c);
                    }
                    if (numtypeterrain == 4)
                    {
                        Case c = new Case(Content.Load<Texture2D>("Montagne"), "Montagne");
                        Random rdm2 = new Random();
                        int quantiteEau = rdm2.Next(2, 5);
                        terrain = new Terrain(quantiteEau, quantiteEau, "Montagne");
                        c.Terrain = terrain;
                        lc.Add(c);
                    }
                    if (numtypeterrain == 5)
                    {
                        Case c = new Case(Content.Load<Texture2D>("Desert"), "Désert");
                        Random rdm2 = new Random();
                        int quantiteEau = rdm2.Next(0, 2);
                        terrain = new Terrain(quantiteEau, quantiteEau, "Désert");
                        c.Terrain = terrain;
                        lc.Add(c);
                    }
                    Thread.Sleep(20);
                }
                tabCase.Add(lc);
            }
        }

    }
}
